package com.lizicloud.infrastructure.common.utils;

import java.util.Map;
import java.util.HashMap;

/**
 * 系统信息工具类
 */
public class SystemUtils {
    
    /**
     * 获取系统属性
     */
    public static String getSystemProperty(String key) {
        try {
            return System.getProperty(key);
        } catch (Exception e) {
            return null;
        }
    }
    
    /**
     * 获取环境变量
     */
    public static String getEnvVariable(String key) {
        try {
            return System.getenv(key);
        } catch (Exception e) {
            return null;
        }
    }
    
    /**
     * 获取操作系统名称
     */
    public static String getOsName() {
        return getSystemProperty("os.name");
    }
    
    /**
     * 获取操作系统版本
     */
    public static String getOsVersion() {
        return getSystemProperty("os.version");
    }
    
    /**
     * 获取Java版本
     */
    public static String getJavaVersion() {
        return getSystemProperty("java.version");
    }
    
    /**
     * 获取Java供应商
     */
    public static String getJavaVendor() {
        return getSystemProperty("java.vendor");
    }
    
    /**
     * 获取用户名
     */
    public static String getUserName() {
        return getSystemProperty("user.name");
    }
    
    /**
     * 获取用户主目录
     */
    public static String getUserHome() {
        return getSystemProperty("user.home");
    }
    
    /**
     * 获取用户工作目录
     */
    public static String getUserDir() {
        return getSystemProperty("user.dir");
    }
    
    /**
     * 获取文件编码
     */
    public static String getFileEncoding() {
        return getSystemProperty("file.encoding");
    }
    
    /**
     * 获取可用处理器数量
     */
    public static int getAvailableProcessors() {
        return Runtime.getRuntime().availableProcessors();
    }
    
    /**
     * 获取JVM总内存
     */
    public static long getTotalMemory() {
        return Runtime.getRuntime().totalMemory();
    }
    
    /**
     * 获取JVM空闲内存
     */
    public static long getFreeMemory() {
        return Runtime.getRuntime().freeMemory();
    }
    
    /**
     * 获取JVM最大内存
     */
    public static long getMaxMemory() {
        return Runtime.getRuntime().maxMemory();
    }
    
    /**
     * 获取已使用内存
     */
    public static long getUsedMemory() {
        return getTotalMemory() - getFreeMemory();
    }
    
    /**
     * 执行垃圾回收
     */
    public static void gc() {
        Runtime.getRuntime().gc();
    }
    
    /**
     * 获取系统信息
     */
    public static Map<String, String> getSystemInfo() {
        Map<String, String> info = new HashMap<>();
        info.put("os.name", getOsName());
        info.put("os.version", getOsVersion());
        info.put("java.version", getJavaVersion());
        info.put("java.vendor", getJavaVendor());
        info.put("user.name", getUserName());
        info.put("user.home", getUserHome());
        info.put("user.dir", getUserDir());
        info.put("file.encoding", getFileEncoding());
        info.put("available.processors", String.valueOf(getAvailableProcessors()));
        info.put("total.memory", formatMemory(getTotalMemory()));
        info.put("free.memory", formatMemory(getFreeMemory()));
        info.put("max.memory", formatMemory(getMaxMemory()));
        info.put("used.memory", formatMemory(getUsedMemory()));
        return info;
    }
    
    /**
     * 格式化内存大小
     */
    public static String formatMemory(long bytes) {
        if (bytes < 1024) {
            return bytes + " B";
        }
        
        double kb = bytes / 1024.0;
        if (kb < 1024) {
            return String.format("%.2f KB", kb);
        }
        
        double mb = kb / 1024.0;
        if (mb < 1024) {
            return String.format("%.2f MB", mb);
        }
        
        double gb = mb / 1024.0;
        return String.format("%.2f GB", gb);
    }
    
    /**
     * 检查是否为Windows系统
     */
    public static boolean isWindows() {
        String osName = getOsName();
        return osName != null && osName.toLowerCase().contains("windows");
    }
    
    /**
     * 检查是否为Linux系统
     */
    public static boolean isLinux() {
        String osName = getOsName();
        return osName != null && osName.toLowerCase().contains("linux");
    }
    
    /**
     * 检查是否为Mac系统
     */
    public static boolean isMac() {
        String osName = getOsName();
        return osName != null && osName.toLowerCase().contains("mac");
    }
    
    private SystemUtils() {
        // 私有构造函数，防止实例化
    }
}